
/**********************************************************************************\
** 文件名称: systime.c
** 创建人员: YCG
** 创建日期: 2018-12-12
** 文档描述:
** 版本代号: V0.1
** 版本说明: 初始版本
\********************************************************************************/
#include "systime.h"
#include "key.h"
#include "VS1838.h"
#include "uart.h"
#include "Servo.h"
#include "motor.h"
#include "RGB.h"
#include "beep.h"

volatile uint32_t SystimeMs = 0;   //系统计时 ms

/*******************************************************************************
** 函数名称: SystimeStart
** 功能描述: 启动系统定时器
** 参数说明: None
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2018-12-14
********************************************************************************/
void SystimeStart(void) {
    NVIC_SetPriority (SysTick_IRQn, 0); /* set Priority for Systick Interrupt */
    SysTick->LOAD  = 47999;                      //将定时周期设为1ms
    SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */
    SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                     SysTick_CTRL_TICKINT_Msk   |
                     SysTick_CTRL_ENABLE_Msk;

    LL_TIM_EnableIT_UPDATE(SYS_TIM);   //使能定时器更新中断
    LL_TIM_EnableCounter(SYS_TIM);     //使能计数器
}


/*******************************************************************************
** 函数名称: GetSystime100us
** 功能描述: 获取us的时间
** 参数说明: None
** 返回说明: 现在的时间
** 创建人员: YCG
** 创建日期: 2018-12-14
********************************************************************************/
uint32_t GetSystimeUs(void) {
    uint32_t timeus = SysTick->VAL;                   //获取定时器中的计数值
    return SystimeMs * 1000 + (48000 - timeus) / 48;  //返回us的时间值
}

/*******************************************************************************
** 函数名称: GetCompareUs
** 功能描述: 获取时间差
** 参数说明: lasttime: [输入] 上一次的时间
** 返回说明: 时间差
** 创建人员: YCG
** 创建日期: 2018-12-14
********************************************************************************/
uint32_t GetGaptimeUs(uint32_t const lasttime) {
    uint32_t const pxtime = GetSystimeUs();    //获取现在的系统时间
    if(pxtime >= lasttime) {  //表示没有溢出
        return (pxtime - lasttime);
    } else {  //溢出了
        return (0xFFFFFFFF - (lasttime - pxtime));
    }
}

/*******************************************************************************
** 函数名称: GetSystime1ms
** 功能描述:
** 参数说明: None
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2018-12-14
********************************************************************************/
uint32_t GetSystimeMs(void) {
    return SystimeMs;
}

/*******************************************************************************
** 函数名称: GetGaptimeMs
** 功能描述:
** 参数说明: lasttime: [输入/出]
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2018-12-14
********************************************************************************/
uint32_t GetGaptimeMs(uint32_t const lasttime) {
    uint32_t const pxtime = SystimeMs;    //获取现在的系统时间
    if(pxtime >= lasttime) {  //表示没有溢出
        return (pxtime - lasttime);
    } else {                  //溢出了
        return ((0xFFFFFFFF / 10) - (lasttime - pxtime));
    }
}

/*******************************************************************************
** 函数名称: DelayUs
** 功能描述: 延时us的函数
** 参数说明: time: [输入] 延时的微妙值
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2018-12-14
********************************************************************************/
void DelayUs(uint32_t const time) {
    uint32_t const pxtime = GetSystimeUs();    //获取当前系统的时间
    while(GetGaptimeUs(pxtime) < time) {}      //等待直到时间达到定时值
}

/*******************************************************************************
** 函数名称: DelayMs
** 功能描述: 延时ms的函数
** 参数说明: time: [输入]  需要延时的值
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2018-12-14
********************************************************************************/
void DelayMs(uint32_t const time) {
    uint32_t volatile pxtime = SystimeMs;    //获取当前系统的时间
    while(GetGaptimeMs(pxtime) <= time) {//等待直到时间达到定时值
    }
}
/*******************************************************************************
** 函数名称: Systime_IRQHandler
** 功能描述: 系统定时器。只用来计算系统的时间
** 参数说明: None
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2018-12-14
********************************************************************************/
void Systime_IRQHandler(void) {
    SystimeMs++;    //系统时间计时

}

/*******************************************************************************
** 函数名称: SystimeEvent_IRQHandler
** 功能描述: 定时任务都放这个函数里面
** 参数说明: None
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2018-12-17
********************************************************************************/
void SystimeEvent_IRQHandler(void) {
    static uint32_t time = 0;

    switch((++time) % 10) {  //分时使用时间片
    case 0:    //00us

        break;

    case 1:    //100us
        KeyScan(SystimeMs);
        break;

    case 2:
        MoterTimeScan(SystimeMs);
        break;

    case 4:
        BeepScan(SystimeMs);
        break;
		
    case 8:    //200us
        RGB_Scan(SystimeMs);
        break;

    default:
        break;

    }
}
/********************************End of File************************************/
